package cn.wolfcode.trip.app.controller;

import cn.wolfcode.trip.base.domain.Travel;
import cn.wolfcode.trip.base.domain.Upvoke;
import cn.wolfcode.trip.base.domain.User;
import cn.wolfcode.trip.base.query.UpvokeQuery;
import cn.wolfcode.trip.base.service.*;
import cn.wolfcode.trip.base.util.JSONResult;
import cn.wolfcode.trip.base.util.UserContext;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 点赞操作控制器
 */
@RestController
@RequestMapping("/upvokes")
public class UpvokeController {

    @Autowired
    private IUpvokeService upvokeService;
    @Autowired
    private IStrategyService strategyService;
    @Autowired
    private IStrategyCommentService strategyCommentService;
    @Autowired
    private ICommentReplyService commentReplyService;
    @Autowired
    private ITravelService travelService;
    /**
     * 点赞操作(适合所有)
     * userId:被点赞人的id
     * @param upvoke
     * @return
     */
    @PostMapping("/{userId}")
    public JSONResult Upvoke(Upvoke upvoke){
        JSONResult jsonResult=new JSONResult();
        upvoke.setUpvoker(UserContext.getCurrentUser());
        upvoke.setCreateTime(new Date());
        //默认设置为 新 状态
        upvoke.setIsnew(1);
        try {
            upvokeService.upvoke(upvoke);
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.mark("error");
        }
        return jsonResult;
    }

    /**
     * 游记点赞操作
     * @param upvoke
     * @return
     */
//    @PostMapping("/{userId}/travels")
//    public JSONResult UpvokeTravels(Upvoke upvoke){
//        JSONResult jsonResult=new JSONResult();
//        upvoke.setUpvoker(UserContext.getCurrentUser());
//        upvoke.setCreateTime(new Date());
//        //默认设置为 新 状态
//        upvoke.setIsnew(1);
//        //游记点赞标识
//        upvoke.setType(1);
//        try {
//            upvokeService.upvoke(upvoke);
//            travelService.updataLikeNum(upvoke.getUserId());
//        } catch (Exception e) {
//            e.printStackTrace();
//            jsonResult.mark("error");
//        }
//        return jsonResult;
//    }
    @PostMapping("/{userId}/travels")
    public JSONResult UpvokeTravels(Upvoke upvoke){
        JSONResult jsonResult=new JSONResult();
        upvoke.setUpvoker(UserContext.getCurrentUser());
        upvoke.setCreateTime(new Date());
        //默认设置为 新 状态
        upvoke.setIsnew(1);
        //游记点赞标识
        upvoke.setType(1);
        try {
            upvokeService.upvoke(upvoke);
            travelService.updataLikeNum(upvoke.getUserId());
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.mark("error");
        }
        return jsonResult.setResult(upvoke);
    }

    @GetMapping("/travels/{relationId}")
    public JSONResult queryForLikeNum(@PathVariable Long relationId){
        JSONResult result = new JSONResult();
        Travel travel = travelService.getById(relationId);
        return result.setResult(travel);
    }

    /**
     * 攻略评论点赞操作
     * relationId(攻略评论id)
     * @param upvoke
     * @return
     */
    @PostMapping("/{userId}/comments")
    public JSONResult UpvokeComments(Upvoke upvoke){
        JSONResult jsonResult=new JSONResult();
        upvoke.setUpvoker(UserContext.getCurrentUser());
        upvoke.setCreateTime(new Date());
        //默认设置为 新 状态
        upvoke.setIsnew(1);
        //攻略评论点赞标识
        upvoke.setType(2);
        try {
            upvokeService.upvoke(upvoke);
            //更新点赞数量
            strategyCommentService.updateLikeNum(upvoke.getRelationId());
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.mark("error");
        }
        return jsonResult.setResult(upvoke);
    }

    /**
     * 攻略点赞操作
     * relationId(攻略Id)
     * @param upvoke
     * @return
     */
    @PostMapping("/strategys")
    public JSONResult UpvokeStrategys(Upvoke upvoke){
        JSONResult jsonResult=new JSONResult();
        upvoke.setUpvoker(UserContext.getCurrentUser());
        upvoke.setCreateTime(new Date());
        //默认设置为 新 状态
        upvoke.setIsnew(1);
        //攻略点赞标识
        upvoke.setType(3);
        try {
            upvokeService.upvoke(upvoke);
            strategyService.updateLikeNum(upvoke.getRelationId());
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.mark("error");
        }
        return jsonResult.setResult(upvoke);
    }

    /**
     * 攻略配评论回复信息的点赞操作
     * 需要前端传过来的参数：relationId(攻略评论回复信息的id)；userId(被点赞人的id)
     * @param upvoke
     * @return
     */
    @PostMapping("/strategyCommentReplies")
    public JSONResult UpvokeStrategyCommentReplies(Upvoke upvoke){
        JSONResult jsonResult=new JSONResult();
        upvoke.setUpvoker(UserContext.getCurrentUser());
        upvoke.setCreateTime(new Date());
        //默认设置为 新 状态
        upvoke.setIsnew(1);
        //攻略点赞标识
        upvoke.setType(4);
        try {
            upvokeService.upvoke(upvoke);
            commentReplyService.updateLikeNum(upvoke.getRelationId());
        } catch (Exception e) {
            e.printStackTrace();
            jsonResult.mark("error");
        }
        return jsonResult;
    }


    /**
     * 获取当前用户的被点赞信息(点赞人的信息，点赞时间等)
     * @return
     */
    @GetMapping
    public PageInfo listUpvokeInfo(UpvokeQuery qo){
        qo.setPageSize(12);
        qo.setOrderBy("up.createTime desc");
        qo.setUserId(UserContext.getCurrentUser().getId());
        PageInfo PageInfo=upvokeService.listUpvokeInfo(qo);
        //跟新状态为2（表示已经看过了）
        upvokeService.updateState(2,qo.getUserId());
        return PageInfo;
    }

    /**
     * 查询当前用户是否对攻略进行点评
     */
    @GetMapping("/hasStategyLikes")
    public Object hasStategyLikes(Upvoke upvoke) {
        List<Upvoke> upvokes = upvokeService.hasStategyLikes(upvoke);
        if (upvokes.size() == 0) {
            return null;
        }
        return upvokes;
    }

    /**
     * 攻略取消赞的接口
     * 参数:relationId
     */
    @DeleteMapping("/strategys/{id}/{relationId}")
    public JSONResult deleteUpvokeStrategies(Upvoke upvoke){
        JSONResult result = new JSONResult();
        try {
            upvokeService.deleteByStrategyIdForStrategy(upvoke);
        }catch (Exception e){
            e.printStackTrace();
            result.mark("erro");
        }
        return result;
    }

    /***
     *  游记取消赞的接口
     * @return
     */
    @DeleteMapping("/travles/{id}/{relationId}")
    public JSONResult deleteUpvokeTravel(Upvoke upvoke){
        JSONResult result = new JSONResult();
        try {
            upvokeService.deleteByStrategyIdForTravel(upvoke);
        }catch (Exception e){
            e.printStackTrace();
            result.mark("erro");
        }
        return result;
    }
    /***
     *  攻略 评论 取消赞的接口
     * @return
     */
    @DeleteMapping("strategyComment")
    public JSONResult deleteUpvokeComments(Upvoke upvoke){
        JSONResult result = new JSONResult();
        User currentUser = UserContext.getCurrentUser();
        if (currentUser != null){
            upvokeService.deleteByStrategyIdForStrategyComment(upvoke);
        }
        return result;
    }

    /**
     * 判断当前用户是否已经点过赞  游记
     * @return
     */
    @GetMapping("/{relationId}/{userId}")
    public JSONResult isUpvoked(Upvoke upvoke){
        JSONResult jsonResult=new JSONResult();
        User currentUser = UserContext.getCurrentUser();
        upvoke.setUpvoker(currentUser);
        if(currentUser==null){
            jsonResult.mark("你还没登录,不可以点赞!");//没登录标识
        }else{
            Upvoke upvoke1 = upvokeService.queryForUpvoke(upvoke);
            if (upvoke1 == null){
                jsonResult.mark("");
            }
            jsonResult.setResult(upvoke1);
        }
        return jsonResult;
    }
    // 判断当前用户是否已经点过赞.攻略
    @GetMapping("/{relationId}")
    public JSONResult isUpvokeds(Upvoke upvoke){
        JSONResult jsonResult=new JSONResult();
        User currentUser = UserContext.getCurrentUser();
        upvoke.setUpvoker(currentUser);
        if(currentUser==null){
            jsonResult.mark("你还没登录,不可以点赞!");//没登录标识
        }else{
            Upvoke upvoke1 = upvokeService.queryForUpvoke(upvoke);
            jsonResult.setResult(upvoke1);
        }
        return jsonResult;
    }


}
